
// 引入接口
const handleBlogRouter = require('./src/router/blog')
const { handleUserRouter,setCookieExpires} = require('./src/router/user')

// const { SuccessModel, ErrorModel } = require('./src/model/resModel')
const querystring = require('querystring')
const { resolve } = require('path')
const { rejects } = require('assert')

const SESSION_DATA = {}; //声明一个空对象用来使用session存数据



const getPostData = (req) => {
    const promise = new Promise((resolve, reject) => {
        if (req.method != 'POST') {
            resolve({})
            return
        }
        if (req.headers['content-type'] != 'application/json') {
            resolve({})
            return
        }
        let postData = ''
        req.on('data', chunk => {
            postData += chunk.toString()
        })
        req.on('end', () => {
            if (!postData) {
                resolve({})
                return
            }
            resolve(JSON.parse(postData))
        })
    })
    return promise
}

const serverHandle = (req, res) => {

    // 设置返回格式
    res.setHeader('content-type', "application/json")
    const url = req.url;
    req.path = url.split('?')[0];
    /* 
    req.query获取到的是在浏览器预览的时候，地址中问号后面的数据，并这个数据以对象的形式存储到了req.query
    req.query = {
        name:'张三'
        keyword:'电视'
    }
    */

    req.query = querystring.parse(url.split('?')[1])

    // 解析cookie
    req.cookie = {};  //目的：req.cookie = {k1:v1,k2:v2}
    const cookieStr = req.headers.cookie || '' //k1=v1;k2=v2 
    cookieStr.split(';').forEach(item => {
        if (!item) {
            return
        }
        const arr = item.split('=')
        const key = arr[0].trim()
        const val = arr[1]
        req.cookie[key] = val;
    });
    // console.log(req.cookie);

    /* 
    实现登录的原理 cookie是可以传给后端的  如果cookie中有username 就是已经登录，如果没有就是没有登录  
    */

    // 解析session
    let needSetCookie = false
    /* 
     req.cookie = {userid:'1234567'}q
    */
    let userid = req.cookie.userid
    // cookie中有userid
    if (userid) {
        /*  // session中没有数据，然后把cookie中有的数据给session
         if(SESSION_DATA[userid]){
             req.session = SESSION_DATA[userid]
         }else{
             ESSION_DATA[userid] = {}
             req.session = SESSION_DATA[userid]
         }
  */
        if (!SESSION_DATA[userid]) {
            SESSION_DATA[userid] = {}
        }
        req.session = SESSION_DATA[userid]
    } else {
        needSetCookie = true
        userid = `${Date.now()}_${Math.random()}`;
        SESSION_DATA[userid] = {}
        req.session = SESSION_DATA[userid]
    }




    // 处理postData
    getPostData(req).then(postData => {
        req.body = postData
console.log(userid);
        // 处理 blog 博客接口
        // const blogData = handleBlogRouter(req, res);
        // if (blogData) {
        //     res.end(JSON.stringify(blogData))
        //     return
        // }

        // 处理blog接口
        const blogResult = handleBlogRouter(req, res);
        if (blogResult) {
            if (needSetCookie) {
                res.setHeader('Set-Cookie', `userid=${userid};path=/;HttpOnly;expires=${setCookieExpires()}`)
            }
            blogResult.then(blogData => {
                res.end(JSON.stringify(blogData))
            })
            return
        }
        // 处理登录接口
        const userResult = handleUserRouter(req, res);
        if (userResult) {
            if (needSetCookie) {
                res.setHeader('Set-Cookie', `userid = ${userid};path=/;HttpOnly;expires=${setCookieEXpires()}`)
            }
            userResult.then(userData => {
                res.end(JSON.stringify(userData))
            })
            return
        }

        // 如果没有路由 返回显示的是404

        res.writeHead(404, { 'content-type': 'text/plain' })
        res.write('404 Not Found')
        res.end()

    })
}




// 定义返回的数据
//     const resData = {
//         name:'张三',
//         site:'sjj',
//         env: process.env.NODE_ENV
//     }
//     res.end(JSON.stringify(resData))


// 向外暴露
module.exports = serverHandle

/* 
    目前session直接是js变量 放在nodejs进程内存中
    1、进程内存是有限的，访问量过大，内存暴增怎么办
    2、当项目正式上线是多进程的，进程之间内存是无法共享

    解决方案 -- redis
    redis是server端最常用的缓存（线上数据存储）数据库  数据放在内存中
    相比与mysql访问速度更快 内存和硬盘不是一个数量

    为什么session适合使用redis
    1、session访问频繁，性能要求极高
    2、session不考虑断电丢失数据的问题，因为存储的是临时数据，临时数据相对于内存来说是一个硬伤
    3、session存储的数据量不会太大（是针对mysql对比的）

    为什么网站数据不适合使用redis
    1、操作频率不是太高（相对于session来说）
    2、断电不丢失，必须保留
    3、数据量太大，内存成本太高
    4、网站数据适合放在mysql中

*/
